package cn.yym.test.servlet;


import cn.yym.test.domain.User;
import cn.yym.test.service.UserService;
import cn.yym.test.service.impl.UserServiceImpl;
import org.apache.commons.codec.digest.DigestUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet(value = "/login", name = "LoginServlet")
public class LoginServlet extends HttpServlet {

    // ctrl + shift + 左右键
    private UserService userService = new UserServiceImpl();

    /**
     * 在数据库密码存储上会采取一定加密机制。md5(不可逆).  了解：加盐。
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        /**
         * 将密码做md5运算之后的字符串。
         * 例如：1 -> c4ca4238a0b923820dcc509a6f75849b, 然后再数据库中去比较密文
         */
        String md5Pwd = DigestUtils.md5Hex(password);

        User user = userService.checkUser(username, md5Pwd);
        /**
         *  1.当用户为空，表示用户名和密码错误，然后要回到登录页面。
         *  2. 要给用户一个提示信息： "用户名或密码错误".
         *  3. 要重定向到登录页面.
         */
        if(null == user) {
            // 如果通过请求转发到登录页面的时候，用户一直刷新，会一直拿着错误的用户名/密码在校验。
            resp.sendRedirect("login.jsp?code=error");
        }else {
            //http://localhost:8080/web/login?rememberMe=abc
            String rememberMe = req.getParameter("rememberMe");
            // 如果remeberMe不为空，并且值也为rememberMe，表示用户勾选了记住我的功能
            if("rememberMe".equals(rememberMe)) {
                // 构建用户名和密码的cookie
                Cookie usernameCookie = new Cookie("username", username);
                Cookie passwordCookie = new Cookie("password", md5Pwd);

                int expire = 2592000;  //保留一个月

                usernameCookie.setMaxAge(expire);  //设置cookie在浏览器的保存时间为一个月
                passwordCookie.setMaxAge(expire);

                resp.addCookie(usernameCookie);   //添加到响应中，就会自动的存储在浏览器中
                resp.addCookie(passwordCookie);
            }
            /**
             * 正确的处理流程：
             *    1.设置到session中。
             *    2.到首页，重定向到 /people 对应的Servlet.
             */
            HttpSession session = req.getSession();
            session.setAttribute("user", user);

            /**
             * 为什么需要重定向到 PeopleServlet, 从后台携带参数到主页。
             */
            resp.sendRedirect("people");
        }
    }
}
